package com.kexilo.config.service;

import com.kexilo.config.domain.ConfigData;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

/**
 * 配置服务接口
 * 定义了配置数据操作的抽象接口，不依赖任何具体实现
 * 
 * @author Kexilo
 */
public interface ConfigService {
    
    /**
     * 根据配置键查询配置值
     * 
     * @param configKey 配置键
     * @return 配置值
     */
    String getConfigValue(String configKey);
    
    /**
     * 根据配置键查询配置值，如果不存在则返回默认值
     * 
     * @param configKey 配置键
     * @param defaultValue 默认值
     * @return 配置值
     */
    String getConfigValue(String configKey, String defaultValue);
    
    /**
     * 异步根据配置键查询配置值
     * 
     * @param configKey 配置键
     * @return 配置值的异步结果
     */
    CompletableFuture<String> getConfigValueAsync(String configKey);
    
    /**
     * 根据配置键查询配置数据对象
     * 
     * @param configKey 配置键
     * @return 配置数据对象
     */
    ConfigData getConfigData(String configKey);
    
    /**
     * 批量根据配置键查询配置值
     * 
     * @param configKeys 配置键列表
     * @return 配置键和对应值的映射
     */
    Map<String, String> getConfigValues(List<String> configKeys);
    
    /**
     * 查询所有配置数据
     * 
     * @return 配置数据列表
     */
    List<ConfigData> getAllConfigs();
    
    /**
     * 根据配置类型查询配置数据
     * 
     * @param configType 配置类型（Y系统内置 N用户自定义）
     * @return 配置数据列表
     */
    List<ConfigData> getConfigsByType(String configType);
    
    /**
     * 保存或更新配置
     * 
     * @param configData 配置数据
     * @return 操作结果
     */
    boolean saveOrUpdateConfig(ConfigData configData);
    
    /**
     * 删除配置
     * 
     * @param configKey 配置键
     * @return 操作结果
     */
    boolean deleteConfig(String configKey);
    
    /**
     * 检查配置键是否存在
     * 
     * @param configKey 配置键
     * @return 是否存在
     */
    boolean exists(String configKey);
    
    /**
     * 刷新配置缓存
     * 
     * @param configKey 配置键，为空时刷新所有
     */
    void refreshCache(String configKey);
    
    /**
     * 预热配置缓存
     * 
     * @param configKeys 需要预热的配置键列表，为空时预热所有
     */
    void warmupCache(List<String> configKeys);
    
    /**
     * 清除所有缓存
     */
    void clearAllCache();
    
    /**
     * 获取布尔类型配置值
     * 
     * @param configKey 配置键
     * @return 布尔值
     */
    boolean getBooleanValue(String configKey);
    
    /**
     * 获取布尔类型配置值（带默认值）
     * 
     * @param configKey 配置键
     * @param defaultValue 默认值
     * @return 布尔值
     */
    boolean getBooleanValue(String configKey, boolean defaultValue);
    
    /**
     * 获取整数类型配置值
     * 
     * @param configKey 配置键
     * @return 整数值
     */
    Integer getIntegerValue(String configKey);
    
    /**
     * 获取整数类型配置值（带默认值）
     * 
     * @param configKey 配置键
     * @param defaultValue 默认值
     * @return 整数值
     */
    Integer getIntegerValue(String configKey, Integer defaultValue);
    
    /**
     * 获取长整数类型配置值
     * 
     * @param configKey 配置键
     * @return 长整数值
     */
    Long getLongValue(String configKey);
    
    /**
     * 获取长整数类型配置值（带默认值）
     * 
     * @param configKey 配置键
     * @param defaultValue 默认值
     * @return 长整数值
     */
    Long getLongValue(String configKey, Long defaultValue);
    
    /**
     * 获取双精度类型配置值
     * 
     * @param configKey 配置键
     * @return 双精度值
     */
    Double getDoubleValue(String configKey);
    
    /**
     * 获取双精度类型配置值（带默认值）
     * 
     * @param configKey 配置键
     * @param defaultValue 默认值
     * @return 双精度值
     */
    Double getDoubleValue(String configKey, Double defaultValue);
    
    /**
     * 监听配置变更
     * 
     * @param configKey 配置键
     * @param listener 变更监听器
     */
    void addConfigChangeListener(String configKey, ConfigChangeListener listener);
    
    /**
     * 移除配置变更监听器
     * 
     * @param configKey 配置键
     * @param listener 变更监听器
     */
    void removeConfigChangeListener(String configKey, ConfigChangeListener listener);
    
    /**
     * 检查服务是否可用
     * 
     * @return 是否可用
     */
    boolean isAvailable();
    
    /**
     * 获取缓存统计信息
     * 
     * @return 缓存统计信息
     */
    Map<String, Object> getCacheStats();
    
    /**
     * 获取服务名称
     * 
     * @return 服务名称
     */
    default String getServiceName() {
        return this.getClass().getSimpleName();
    }
    
    /**
     * 获取服务版本
     * 
     * @return 服务版本
     */
    default String getServiceVersion() {
        return "1.0.0";
    }
    
    /**
     * 配置变更通知（可扩展用于数据同步）
     * 
     * @param configKey 配置键
     * @param operation 操作类型：CREATE, UPDATE, DELETE
     * @param configData 配置数据
     */
    default void notifyConfigChange(String configKey, String operation, ConfigData configData) {
        // 默认实现为空，具体实现类可以覆盖此方法
    }
    
    /**
     * 配置变更监听器接口
     */
    @FunctionalInterface
    interface ConfigChangeListener {
        /**
         * 配置变更时触发
         * 
         * @param configKey 配置键
         * @param oldValue 旧值
         * @param newValue 新值
         */
        void onConfigChanged(String configKey, String oldValue, String newValue);
    }
}
